#include <unistd.h>

#include <csignal>
#include <cstdlib>
#include <iostream>
using namespace std;

void handler(int signum) { printf("func handler get a signum :%d\n", signum); }

int main() {
  // 设置信号处理函数
//   signal(SIGINT, handler);
  signal(SIGKILL, handler);

  // 对 SIGINT 信号进行屏蔽
  sigset_t bset;
  if (sigemptyset(&bset)) {
    cerr << "sigemptyset best fail" << endl;
    exit(1);
  }

  //   if (sigaddset(&bset, SIGINT)) {
  if (sigaddset(&bset, SIGKILL)) {
    cerr << "sigaddset SIGINT fail" << endl;
    exit(2);
  }

  sigset_t oset;
  if (sigemptyset(&oset)) {
    cerr << "sigemptyset oset fail" << endl;
    exit(3);
  }

  if (sigprocmask(SIG_SETMASK, &bset, &oset)) {
    cerr << "sigprocmask SIG_SETMASK fail" << endl;
    exit(4);
  }

  // 重复打印进程中的未决信号集
  sigset_t pending;
  if (sigemptyset(&pending)) {
    cerr << "sigemptyset pending fail" << endl;
    exit(5);
  }

  int cnt = 0;
  while (1) {
    sigpending(&pending);  // 获取未决信号集
    for (int i = 31; i > 0; --i) {
      // 以01位图的形式打印信号集
      // 调用sigismember函数 信号存在返回1 不存在返回0
      // 忽略查错处理
      if (sigismember(&pending, i)) {
        cout << "1";
      } else {
        cout << "0";
      }
    }
    
    cout << endl << endl;
    sleep(1);
    // ++cnt;
    // if (cnt == 4) {
    //   // 大约4秒左右 SIGINT 信号将被解除阻塞
    //   // 解除阻塞后发出的 SIGINT 信号将被 signal()捕获
    //   // 从而执行自定义动作而不默认终止
    //   sigprocmask(SIG_SETMASK, &oset, nullptr);
    // }
  }
  // 发送 SIGINT 信号 --- 可以通过按 Ctrl + C 或使用 kill -2 <pid> 发送
  return 0;
}